#!/usr/bin/env python
# -*- coding:utf-8 -*-


'''
@CreateTime: 2020/12/08 11:19
@Author : shouke
'''

import logging

import jmespath
from utils.utils import Utils
from components.decoraters.action_decorater import ActionDecorator

logger = logging.getLogger(__name__)


class JmespathExtracter(object):
    @ActionDecorator.action_register('extract_by_jmespath', 'JmespathExtracter', 'extract_by_jmespath', __name__)
    @classmethod
    def extract_by_jmespath(self, config:dict, *args, **kwargs):
        '''
         jmespath 提取器
        :param config 提取配置信息，如下
        {
            "refName": "token", #引用名称 # 不能为空
            "express": 'token"', #jmespath表达式 参考 https://jmespath.org/tutorial.html
            "target": "body", # 提取源对象目标域(固定为body)
            "response":responseObj # 提取源对象-请求响应、程序输出
        }
        '''

        logger.debug('正在执行JMESPATH提取')
        user = kwargs['user']
        user_resource_dict = user.user_resource_dict[user.chain_id]
        response = config.get('response')

        variable = config.get('refName').strip()
        express = config.get('express')

        logger.debug('【引用名称为】：%s' % variable)
        logger.debug('【JMESPATH提取表达式】：%s' % express)

        try:
            response = response.json()

            if not response:
                 logger.warn('【JMESPATH提取结果】：提取失败，响应结果为空')
                 return
            logger.debug('【提取源对象】：%s' % str(response))
        except Exception as e:
            logger.error('【JMESPATH提取结果】：提取失败，服务器返回非json数据')
            return

        if not express:
            logger.error('【JMESPATH提取结果】：提取失败，未填写提取表达式')
            return

        if not variable:
            logger.error('【JMESPATH提取结果】：提取失败，未配置引用变量')
            return

        express = Utils.analyze_data(express, user_resource_dict)
        match_result = jmespath.search(express, response)
        if match_result:
            user_resource_dict[variable] = match_result
            logger.debug('【JMESPATH提取结果】：提取成功，提取值为：%s' % user_resource_dict[variable])
        else:
            logger.debug('【JMESPATH提取结果】：提取失败，提取值为空')

